home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gekkan Dennou Club 147
/
Gekkan Dennou Club - 2000.8 Vol. 147 (Japan).7z
/
Gekkan Dennou Club - 2000.8 Vol. 147 (Japan) (Track 1).bin
/
fdimg
/
—‹Œêsrc.lzh
/
xf.c
< prev
next >
Wrap
C/C++ Source or Header
|
1993-03-19
|
50KB
|
2,340 lines
#include "3DDEF.H"
#include "GLOBAL.H"
#include "FORWARD.H"
#include "XCODE.H"
#include "FORWARD2.H"
extern int kigou_or_code;
extern UBYTE handakuten_list[];
extern UBYTE dakuten_list[];
extern UBYTE left[MAXLINE],right[MAXLINE],right_r[MAXLINE];
extern int leftc,rightc;
extern UWORD CRX,CRY;
extern UWORD view_flag;
extern WORD VERSION;
WORD UNDER_FLAG;
int XF3_RUN;
UBYTE koho_10[10+1][MAXLINE];
UWORD koho_10x[10+1];
UWORD koho_max;
UBYTE f7_buff[32];
UBYTE ledpat;
UWORD CXF1_FLAG = 1;
UWORD TBCP0 = 0;
UWORD LAST_TR = 0;
UWORD LAST_TR0 =0,TBUFFC_R0 = 0;
/* リターンすべきかどうかのフラグを返す */
int
xf_check(UINT c)
{
UINT x,y;
if (c < 0x100) {
return(0);
}
/*etc_beep();*/
/* 変換バッファが空の場合を先にチェック */
switch(c) {
case 0x101:
case 0x111: /* SHIFTL_XF1:変換モードに入る/抜ける */
if (DUM_FLAG) return(1);
if (FP_MODE[3] == 'H') { /* 変換モードであった */
xf_ikinari_kakutei();
fep_hmode_set((UBYTE)'M');
} else {
fep_hmode_set((UBYTE)'H');
}
disp_hmode(); /* 一番下の行に変換モード表示を行う */
etc_while_fep_qxf(); /* 離されるまで待つ */
return(1);
case 0x121: /* 変換モードと半角無変換ANKをトグルする */
if (DUM_FLAG) {
return(1);
}
xf_do_121();
return(1);
break;
case 0x108: /* 記号入力開始 */
xf_ikinari_kakutei();
etc_func_off();
kigou_or_code = 1;
return(1);
case 0x10c: /* コード入力開始 */
xf_ikinari_kakutei();
etc_func_off();
FNCKEYGT(7,f7_buff);
FNCKEYST(7,"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0");
etc_while_fep_qxf(); /* 離されるまで待つ */
kigou_or_code = 2;
return(1);
case 0x107: /* 登録開始 */
if (!UNDER_FLAG) {
xf_touroku();
}
return(1);
case 0x117:
case 0x127: /* 削除開始 */
if (!UNDER_FLAG) {
xf_sakujyo();
}
return(1);
case 0x10f: /* 全角 */
xf_toggle_fp_mode(0); /* 全角をトグルする */
etc_while_fep_qxf(); /* 離されるまで待つ */
return(1);
case 0x109: /* ひらがな */
break;
xf_toggle_fp_mode(1);
etc_while_fep_qxf(); /* 離されるまで待つ */
return(1);
case 0x10d: /* ローマ字 */
if ((FP_MODE[1] == (UBYTE)'K') && (FP_MODE[2] != 'R')) {
xf_toggle_fp_mode(1);
}
xf_toggle_fp_mode(2);
etc_while_fep_qxf(); /* 離されるまで待つ */
return(1);
case 0x10e: /* かな */
if ((FP_MODE[1] != (UBYTE)'K') && (FP_MODE[2] == 'R')) {
xf_toggle_fp_mode(2);
}
xf_toggle_fp_mode(1);
etc_while_fep_qxf(); /* 離されるまで待つ */
return(1);
case 0x10b: /* CAPS */
etc_while_fep_qxf(); /* 離されるまで待つ */
return(1);
case 0x102: /* XF2 */
LEDMOD(3,!(K_SFTSNS() & 0b00010000000));
etc_while_fep_qxf(); /* 離されるまで待つ */
return(1);
#if 0
case 0x228: /* CTRL-F8 :辞書名変更 */
if (DUM_FLAG) return(1);
/* xf_dic_flush();*/
xf_dic_change();
etc_while_fep_qxf(); /* 離されるまで待つ */
return(1);
#endif
case 0x229: /* CTRL-F9 :学習モード変更 */
if (DUM_FLAG) return(1);
ctrl_t_dm();
return(1);
/*
UWORD TBCP0 = 0;
UWORD LAST_TR = 0;
UWORD LAST_TR0 =0,TBUFFC_R0 = 0;
*/
case 0x1ff:
if (view_flag) {
return(1);
}
if (!UNDER_FLAG && TL1) {
if ((FP_MODE[2] == 'R') && !TBUFFC_R) {
if ((TBCP0 == TBCP) && (LAST_TR0 == LAST_TR)
&& (TBUFFC_R0 == TBUFFC_R)) {
xf_disp_insert(&TX,&TY);
} else {
TBCP0 = TBCP;
LAST_TR0 = LAST_TR;
TBUFFC_R0 = TBUFFC_R;
}
} else {
xf_disp_insert(&TX,&TY);
}
}
return(1);
default:
break;
}
return(0);
}
UWORD fep_xf_bind_table[MAX_XF];
/*UWORD fep_key_bind_table[MAX_XF];*/
void
xf(int c)
{
UINT c0;
register int i;
int flag;
STR p;
UBYTE TB[TBUFF_SIZE];
if (xf_check(c)) {
return;
}
if (!TBUFFC && !TBUFFC_R) {
return; /* 変換バッファが空なら何もしない */
}
for(i=0;i<SEG_MAX;i++) {
SEG_FLAG[i] = 0;
}
line_seigyou();
switch(c) {
case 0x103: /* 変換開始 */
xf_flush_tb_r();
XF3_RUN = 0;
strcpy(TBUFF_R,&TBUFF[TBCP]);
TBUFF[TBCP] = EOS;
kcount = KNJCTRL(19,TBUFF,kc,k1); /* 19=変換開始 */
fnumber = 0; /* 文節番号 */
SEG[fnumber][0] = EOS;
knumber = 1; /* 候補番号 */
bnumber = 0; /* ブロック番号 */
if (xf_disp(fnumber,kc,k1)) {
return;
}
do {
c0 = fep_INKEY_wait();
if (c0 == L' ') {
c0 = ' ';
} else {
if (SP_XFER && (c0 == 0x1ff) && !TBUFFC_R) {
c0 = ' ';
}
}
if (c0 < MAX_XF) { /* 変換中のキーバインド変更 */
if (!(c0 = fep_xf_bind_table[c0])) {
continue; /* 0に引っ掛かった */
}
}
flag = xf0(c0);
} while(!flag);
if (flag <= 1) {
disp_half_flush(TL0,TY0);
} else {
return;
}
break;
case 0x104: /* かな/カナ変換 */
/* RAW color のまま変換する */
/* かなに戻せばかな漢字変換可能 */
TBCP += TBUFFC_R;
TBUFFC += TBUFFC_R;
xf_cat_r_init(TBUFF,TBUFF_R);
p = TBUFF;
while(1) {
p = etc_jfirst_x(p,&c0);
if (!p) return; /* かな/カナが見付からなかった */
if ((c0 >= L'ヴ') && (c0 <= L'ヶ')) {
p += 2;
continue;
}
if (etc_jiskata(c0)) {
etc_zen_kata_to_hira(TBUFF,TBUFF,TBUFF_SIZE);
TBCP = TBUFFC = strlen(TBUFF);
break;
} else if (etc_jishira(c0)) {
etc_zen_hira_to_kata(TBUFF,TBUFF,TBUFF_SIZE);
TBCP = TBUFFC = strlen(TBUFF);
break;
}
/* 続行 */
}
if (xf_disp_insert(&TX,&TY)) {
return;
}
work_cursor_cpx();
etc_while_fep_qxf(); /* 離されるまで待つ */
break;
case 0x105: /* いきなり全文確定 */
xf_ikinari_kakutei();
break;
case 0x122: /* CTRL+XF2 左側を確定 */
break;
case 0x124: /* CTRL+XF4 ルビにする */
xf_cat_r_init(TBUFF,TBUFF_R);
strcpy(TB,TBUFF);
ctrl_ubar();
/* CY = window_is_this_line_in_current(CL);*/
if ((CL->ATO == TAIL) && !line_length(CL)) {
break;
}
/* break;*/
xf_rubi(TB);
xf_init_tb();
etc_trim_tail();
break;
case 0x114: /* SHIFT+XF4 全角/半角変換 */
/* RAW color のまま変換する */
xf_cat_r_init(TBUFF,TBUFF_R);
p = TBUFF;
while(1) {
p = etc_jfirst_x(p,&c0); /* c0 = 最初の文字 */
if (!p) {
return; /* かな/カナが見付からなかった */
}
if (0x839f <= c0) { /* 漢字 */
continue;
}
if ((c0 > 0x100) && ((c0 & 0xff00) != 0x8000)) { /* 全角ってことで */
etc_str_zen_to_han(TBUFF,TBUFF,TBUFF_SIZE);
TBCP = TBUFFC = strlen(TBUFF);
break;
} else {
etc_str_han_to_zen(TBUFF,TBUFF,TBUFF_SIZE);
TBCP = TBUFFC = strlen(TBUFF);
break;
}
/* 続行 */
}
xf_disp_insert(&TX,&TY);
work_cursor_cpx();
etc_while_fep_qxf(); /* 離されるまで待つ */
break;
}
}
void
xf_ikinari_kakutei()
{
etc_color(NORMAL);
if (UNDER_FLAG) {
fep_under_ikinari_kakutei();
} else if (TBUFFC || TBUFFC_R) {
TBCP += TBUFFC_R;
TBUFFC += TBUFFC_R;
/*window0();printf("(%s)(%s)",TBUFF,TBUFF_R);binkey();*/
xf_cat_r_init(TBUFF,TBUFF_R);
work_replace_str_echo(TL0,TBP0,TL1,TBP1,TBUFF,TBCP,TY0);
xf_init_tb();
disp_half_flush(CL,CY);
/* disp_half_flush(TL0,TY0);*/
under_blanc();
}
etc_trim_tail();
}
/* 変換開始 */
int
xf0(int c)
{
register int i;
int w;
short ws;
UBYTE kc0[TBUFF_SIZE];
int knumber0;
int kohox;
UBYTE tlast[MAXLINE];
switch(c) {
case 0x101: /* XF1:前文節へ */
if (fnumber > 0) {
strcpy(SEG[fnumber],kc);
KNJCTRL(25,knumber,kc0,kc,k1,&ws); /* 一旦文節を確定する */
etc_func_on(); /* 数字選択状態から脱出 */
XF3_RUN = 0;
kcount = KNJCTRL(35,kc,k1); /* 35=前文節への移動 */
kcount = KNJCTRL(35,kc,k1); /* 35=前文節への移動 */
fnumber--;
knumber = 1; /* 候補番号 */
bnumber = 0; /* ブロック番号 */
if (xf_disp(fnumber,kc,k1)) {
return(-1);
}
}
break;
case L'1':
case L'2':
case L'3':
case L'4':
case L'5':
case L'6':
case L'7':
case L'8':
case L'9':
if (XF3_RUN < 2) { /* 数値選択状態でなかった */
goto else_kakutei; /* その数値を入力して確定 */
}
c = zentohan(c); /* 数値選択をして次候補 */
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9': /* 数値選択をして次候補 */
knumber = c -'0';
if ((knumber < koho_max) && (XF3_RUN >= 2)) {
strcpy(kc,koho_10[knumber]);
/* break しない */
} else {
etc_beep();
break;
}
case 0x102: /* 次文節へ */
strcpy(SEG[fnumber],kc);
etc_func_on();
if (w = KNJCTRL(25,knumber,kc0,kc,k1,&ws)) {
if (kcount = ws) {
fnumber++;
knumber = 1; /* 候補番号 */
bnumber = 0; /* ブロック番号 */
XF3_RUN = 0;
if (xf_disp(fnumber,kc,k1)) {
return(-1);
}
} else { /* 次の候補がない=最後の文節である */
strcpy(kc,SEG[fnumber]);
kcount = KNJCTRL(35,kc,k1); /* 35=前文節への移動 */
if (xf_disp(fnumber,kc,k1)) {
return(-1);
}
XF3_RUN = 0;
break;
/* goto kakutei;*/
}
} else {
/* etc_func_on0();*/
etc_beep();
}
break;
case 0x113:
case FEP_LEFTARROW_CODE:
maekoho:
/* 数字選択状態にして左候補へ */
if (XF3_RUN >= 2) { /* すでに数字選択状態だった */
if (knumber > 1) { /* 前候補ブロックに行かなくてもよい */
knumber0 = knumber--;
kohox = koho_10x[knumber];
if (disp_koho(knumber,knumber,&kohox,koho_10[knumber])) {
/* 表示しきれない */
}
if (disp_koho(knumber0,knumber,&kohox,koho_10[knumber0])) {
/* 表示しきれない */
}
} else { /* 前候補ブロックへ行く */
if (bnumber) { /* 前ブロックがあるはず */
bnumber--;
knumber = 9;
goto maeblock; /* 前候補ブロックへ */
}
}
} else { /* まだ数字選択状態ではない */
knumber0 = knumber;
if (knumber > 1) {
knumber--;
}
XF3_RUN = 5; /* フラグみたいなもの */
etc_func_off(); /* ファンクションキーの表示を消す */
while(knumber0 != 1) { /* 戻る */
knumber0--;
w = KNJCTRL(20,kc,k1); /* 20=候補群ブロック内の前候補を得る */
}
strcpy(koho_10[1],kc); /* 最初は1 */
knumber0 = 2;
while(1) {
if (KNJCTRL(21,kc,k1)) {
strcpy(koho_10[knumber0++],kc);
} else {
koho_10[knumber0][0] = EOS;
koho_max = knumber0;
break;
}
}
disp_koho_block(knumber);
}
strcpy(kc,koho_10[knumber]);
if (xf_disp(fnumber,kc,k1)) {
return(-1);
}
break;
case ' ':
case 0x103: /* 次候補:XF0 だから */
case FEP_RIGHTARROW_CODE:
migikoho:
switch (XF3_RUN) {
case 0:
/* 通常次候補 */
/* 無条件に第一ブロック */
XF3_RUN++;
if (KNJCTRL(21,kc,k1)) { /* 21=候補群ブロック内の次候補を得る */
/* すんなり見付かった */
knumber++;
if (xf_disp(fnumber,kc,k1)) {
return(-1);
}
break;
}
/* あるだけで、数値選択モード突入 */
/* 尻抜け */
case 1:
/* 数値選択状態突入 */
etc_func_off(); /* ファンクションキーの表示を消す */
knumber0 = knumber;
while(knumber0 != 1) { /* 戻る */
knumber0--;
w = KNJCTRL(20,kc,k1); /* 20=候補群ブロック内の前候補を得る */
}
knumber++;
strcpy(koho_10[1],kc); /* 最初は1 */
knumber0 = 2;
while(1) {
if (KNJCTRL(21,kc,k1)) {
strcpy(koho_10[knumber0++],kc);
} else {
koho_10[knumber0][0] = EOS;
koho_max = knumber0;
break;
}
}
if (!*koho_10[knumber]) { /* 数字選択状態突入と同時に候補が無ければ */
/* 2つの候補だけ表示する */
knumber = 1;
}
disp_koho_block(knumber);
strcpy(kc,koho_10[knumber]);
if (xf_disp(fnumber,kc,k1)) {
return(-1);
}
XF3_RUN++;
break;
case 2:
default:
/* 数字選択状態継続 */
knumber0 = knumber++;
if (*koho_10[knumber]) { /* ある */
kohox = koho_10x[knumber0];
if (disp_koho(knumber0,knumber,&kohox,koho_10[knumber0])) {
/* 表示しきれない */
}
/* kohox = koho_10x[knumber];*/
if (disp_koho(knumber,knumber,&kohox,koho_10[knumber])) {
/* 表示しきれない */
}
strcpy(kc,koho_10[knumber]);
if (xf_disp(fnumber,kc,k1)) {
return(-1);
}
} else { /* もうない */
if (KNJCTRL(23,kc,k1)) { /* 次候補ブロックの作成 */
/* あった */
bnumber++;
} else { /* 無かった */
while(KNJCTRL(22,kc,k1)); /* 前候補ブロックの作成 */
/* 最初まで遡る */
bnumber = 0;
}
knumber = 1;
strcpy(koho_10[1],kc); /* 最初は1 */
knumber0 = 2;
while(1) {
if (KNJCTRL(21,kc,k1)) {
strcpy(koho_10[knumber0++],kc);
} else {
koho_10[knumber0][0] = EOS;
koho_max = knumber0;
break;
}
}
if (!*koho_10[knumber]) {
knumber = 1;
}
disp_koho_block(knumber);
strcpy(kc,koho_10[knumber]);
if (xf_disp(fnumber,kc,k1)) {
return(-1);
}
}
break;
}
break;
case 0x104: /* ひらがな/カタカナ変換 */
/* 最初はとにかく「ひらがな」へ */
/* その後はトグル */
if (etc_is_there_han2byte(kc)) {
etc_beep();
under_print("現在の状態ではひらがな⇔カタカナ変換はできません");
break;
}
if (SEG_FLAG[fnumber]) {
w = KNJCTRL(37,kc,k1); /* 37=先頭文節をカタカナにする */
SEG_FLAG[fnumber] = 0;
} else {
w = KNJCTRL(38,kc,k1); /* 38=先頭文節をひらがなにする */
SEG_FLAG[fnumber] = 1;
}
XF3_RUN = 0;
etc_func_on();
if (xf_disp(fnumber,kc,k1)) {
return(-1);
}
etc_while_fep_qxf(); /* 離されるまで待つ */
break;
case 0x114: /* 半角/全角変換 */
/* 最初はとにかく「半角」へ */
/* その後はトグル */
w = KNJCTRL(37,kc,k1); /* 37=先頭文節をカタカナにする */
if (SEG_FLAG[fnumber]) {
etc_str_han_to_zen(kc,kc,MAXLINE); /* 先頭文節を全角にする */
SEG_FLAG[fnumber] = 0;
} else {
etc_str_zen_to_han(kc,kc,MAXLINE); /* 先頭文節を半角にする */
SEG_FLAG[fnumber] = 1;
}
XF3_RUN = 0;
etc_func_on();
if (xf_disp(fnumber,kc,k1)) {
return(-1);
}
etc_while_fep_qxf(); /* 離されるまで待つ */
break;
case '_' - '@': /* 生入力削除 */
ctrl_ubar();
return(1);
case TAB:
case 'M'-'@':
case CR:
case 0x105: /* 全体確定 */
kakutei:
etc_func_on0();
if (XF3_RUN >= 2) { /* 数字選択状態だった */
UBYTE d1[MAXLINE],d2[MAXLINE];
w = KNJCTRL(25,knumber,kc,d1,d2,&ws);
}
xf_get_last(TLAST_SUM,fnumber,kc,k1);
w = KNJCTRL(24,tlast); /* 全体確定 */
/* 変換後が長すぎる場合の切り詰めを検出できないので tlast はダミー */
w = strlen(TLAST_SUM);
strcat(TLAST_SUM,TBUFF_R);
etc_color(NORMAL);
work_replace_str_echo(TL0,TBP0,TL1,TBP1,TLAST_SUM,w,TY0);
xf_init_tb();
under_blanc();
etc_while_fep_qxf(); /* 離されるまで待つ */
return(1);
case 0x111: /* 文節を短くする */
etc_func_on();
w = KNJCTRL(34,kc,k1); /* 34=先頭文節を1文字短くして再変換 */
for(i=1;i<=9;i++) {
*koho_10[i] = EOS;
}
XF3_RUN = 0;
if (xf_disp(fnumber,kc,k1)) {
return(-1);
}
break;
case 0x112: /* 文節を長くする */
etc_func_on();
w = KNJCTRL(33,kc,k1); /* 33=先頭文節を1文字長くして再変換 */
for(i=1;i<=9;i++) {
*koho_10[i] = EOS;
}
XF3_RUN = 0;
if (xf_disp(fnumber,kc,k1)) {
return(-1);
}
break;
case '['-'@': /* キャンセル */
etc_func_on();
if (xf_disp_insert(&TX,&TY)) {
return(-1);
}
etc_while_fep_qxf(); /* 離されるまで待つ */
return(2);
break;
case FEP_DEL_CODE: /* DEL */
break;
case FEP_HOME_CODE: /* HOME */
break;
case FEP_DNARROW_CODE: /* dn */
xf_next_block:
if (KNJCTRL(23,kc,k1)) { /* 次候補ブロックの作成 */
XF3_RUN = 3; /* !!! 強制 */
etc_func_off();
knumber = 1;
bnumber++;
strcpy(koho_10[1],kc); /* 最初は1 */
knumber0 = 2;
while(1) {
if (KNJCTRL(21,kc,k1)) {
strcpy(koho_10[knumber0++],kc);
} else {
koho_10[knumber0][0] = EOS;
koho_max = knumber0;
break;
}
}
strcpy(kc,koho_10[knumber]);
disp_koho_block(knumber);
if (xf_disp(fnumber,kc,k1)) {
return(-1);
}
}
break;
case FEP_UPARROW_CODE: /* up */
xf_before_block:
if (bnumber) {
knumber = 1;
bnumber--;
maeblock:
KNJCTRL(22,kc,k1); /* 前候補ブロックの作成 */
strcpy(koho_10[1],kc); /* 最初は1 */
knumber0 = 2;
while(1) {
if (KNJCTRL(21,kc,k1)) {
strcpy(koho_10[knumber0++],kc);
} else {
koho_10[knumber0][0] = EOS;
koho_max = knumber0;
break;
}
}
/*window0();printf("(%d)(%d)",knumber,koho_max);binkey();*/
knumber = min(knumber,koho_max-1);
strcpy(kc,koho_10[knumber]);
disp_koho_block(knumber);
if (xf_disp(fnumber,kc,k1)) {
return(-1);
}
}
break;
default:
if (c == XF_NEXT_BLOCK_KEY) { /* 次候補ブロックへ */
goto xf_next_block;
} else if (c == XF_BEFORE_BLOCK_KEY) { /* 前候補ブロックへ */
goto xf_before_block;
} else if (c == XF_RIGHT_KOHO_KEY) { /* 右候補へ */
goto migikoho;
} else if (c == XF_LEFT_KOHO_KEY) { /* 左候補へ */
goto maekoho;
}
else_kakutei:
/* スペース以外の普通の文字 -> 全体を確定して、プッシュ */
etc_func_on();
if (XF3_RUN >= 2) { /* 数字選択状態だった */
UBYTE d1[MAXLINE],d2[MAXLINE];
w = KNJCTRL(25,knumber,kc,d1,d2,&ws);
}
xf_get_last(TLAST_SUM,fnumber,kc,k1);
w = KNJCTRL(24,tlast); /* 全体確定 */
w = strlen(TLAST_SUM);
if (c != 0x1ff) {
strcat(TLAST_SUM,TBUFF_R);
etc_color(NORMAL);
work_replace_str_echo(TL0,TBP0,TL1,TBP1,TLAST_SUM,w,TY0);/* 確定部分を表示 */
xf_init_tb0();
TTOPL00 = line_my_top();
TL00 = TL1 = TL0 = CL; /* 変換バッファの開始行 */
CRX = CRY = 0;
TPX00 = TPX0 = CPX;
TX00 = TX = TX0 = CX;
TY00 = TY = TY0 = CY;
TBP1 = TBP00 = TBP0 = ANALYZE[CPX].BPOS;
fep_push_key(c);
etc_while_fep_qxf(); /* 離されるまで待つ */
return(1);
} else { /* 1ff だ */
etc_color(NORMAL);
work_replace_str_echo(TL0,TBP0,TL1,TBP1,TLAST_SUM,w,TY0);/* 確定部分を表示 */
/* 完全に挿入 */
xf_init_tb00();
TTOPL00 = line_my_top();
TL00 = TL1 = TL0 = CL; /* 変換バッファの開始行 */
CRX = CRY = 0;
TPX00 = TPX0 = CPX;
TX00 = TX = TX0 = CX;
TY00 = TY = TY0 = CY;
TBP1 = TBP00 = TBP0 = ANALYZE[CPX].BPOS;
if (xf_disp_insert(&TX,&TY)) {
return(-1);
}
return(2);
}
break;
}
fep_key_clear();
etc_while_fep_qxf(); /* 離されるまで待つ */
return(0);
}
/* TL0,TPX0,TX0,TY0,TBP0 */
/* TL1,TPX1,TX1,TY1,TBP1 */
/* の2点に挟まれた間を表示する */
/* fn が現在作業中の文節 */
/* 中断なら非零 */
int
xf_disp(int fn,STR kc,STR k1)
{
UBYTE first_left[TBUFF_SIZE];
UBYTE f0[TBUFF_SIZE];
register int i;
int upc; /* スクロールアップしたカウンタ */
int wTX0,wTY0;
*f0 = EOS;
for(i=0;i<fn;i++) {
strcat(f0,SEG[i]);
} /* 半確定の文節をひとつにまとめる */
line_get_body(first_left,TL0);
first_left[TBP0] = EOS; /* 変換の対象になってない左部分 */
/* era_box * 3 が無駄 */
wTX0 = TX0;
wTY0 = TY0;
if (*f0) {
etc_color(OFUSI);
upc = disp_out_stop(first_left,&wTX0,&wTY0,f0);
if (upc) { /* 画面から出る */
if ((TY0 -= upc) < 0) { /* ゲロ */
/* 警告して、変換をキャンセルする */
TY0 += upc; /* 戻す */
*f0 = EOS;
xf_ob();
return(1);
}
}
}
etc_color(CFUSI);
upc = disp_out_stop(first_left,&wTX0,&wTY0,kc);
if (upc) { /* 画面から出る */
if ((TY0 -= upc) < 0) {
TY0 += upc; /* 戻す */
*kc = EOS;
xf_ob();
return(1);
}
}
if (*k1) {
etc_color(OFUSI);
upc = disp_out_stop(first_left,&wTX0,&wTY0,k1);
if (upc) { /* 画面から出る */
if ((TY0 -= upc) < 0) {
TY0 += upc; /* 戻す */
*k1 = EOS;
xf_ob();
return(1);
}
}
}
etc_color(NORMAL);
upc = disp_out_stop(first_left,&wTX0,&wTY0,TBUFF_R);
if (upc) { /* 画面から出る */
if ((TY0 -= upc) < 0) {
TY0 += upc; /* 戻す */
*TBUFF_R = EOS;
xf_ob();
return(1);
}
}
/* etc_color(MIZU_EMPH_REV);*/
disp_trans_half_flush(TL1,TBP1,wTX0,wTY0);
window_loc(wTX0,wTY0);
disp_cursor_on();
etc_while_fep_qxf(); /* 離されるまで待つ */
return(0);
}
void
xf_init_tb0()
{
xf_init_tb00();
TBUFFC_R = 0;
*TBUFF_R = EOS;
ctrl_ubar();
}
void
xf_init_tb00()
{
TBCP = TBUFFC = TBUFFC_L = 0;
*TBUFF = *TBUFF_L = EOS;
}
void
xf_init_tb()
{
xf_init_tb0();
xf_init_tb_r();
}
/*
if (((c == L'゜') && (jstrchr(handakuten_list,cl)))
|| ((c == L'゛') && (jstrchr(dakuten_list,cl)))) {
*/
int
xf_append_tb(UINT c)
{
STR p;
if (c & 0xff00) { /* 2バイト文字である */
register int cl;
if ((c == L'゛') || (c == L'゜')) {
if (cl = etc_jlast_p(TBUFF,&p)) {
if ((c == L'゜') && (jstrchr(handakuten_list,cl))) {
cl += 2;
} else if ((c == L'゛') && (jstrchr(dakuten_list,cl))) {
cl++;
} else {
goto xf_henna_dakuten;
}
*p++ = (cl >> 8) & 0xff;
*p = cl & 0xff;
xf_disp_insert(&TX,&TY);
return(0);
}
}
xf_henna_dakuten:
if ((TBUFFC+2) > MAX_TB) {
xf_init_tb_r00();
/*binkey();*/
return(1);
}
lddr(&TBUFF[TBCP+2],&TBUFF[TBCP],TBUFFC-TBCP);
TBUFF[TBCP++] = (c >> 8);
TBUFF[TBCP++] = (c &0xff);
TBUFFC += 2;
TBUFF[TBUFFC] = EOS;
} else { /* 1バイト文字である */
if ((TBUFFC+1) > MAX_TB) {
xf_init_tb_r00();
return(1);
}
lddr(&TBUFF[TBCP+1],&TBUFF[TBCP],TBUFFC-TBCP);
TBUFF[TBCP++] = c;
TBUFF[++TBUFFC] = EOS;
}
xf_disp_insert(&TX,&TY);
return(0);
}
/* 格納出来る長さかどうかをチェック */
int
xf_set_tb_check(STR s)
{
register int i;
register STR p;
UWORD c;
p = s;
i = 0;
/*window0();*/
while(1) {
p = line_skip_xcode(p);
if (c = etc_jfirst(p)) {
if (c & 0xff00) { /* 2バイト文字である */
i += 2;
p += 2;
} else {
i++;
p++;
}
if (i > MAX_TB) {
return(1);
}
} else {
break;
}
}
return(0);
}
/* 非零ならばフル */
/* TBUFFに s を格納する */
int
xf_set_tb(STR s)
{
UBYTE w[MAXLINE];
register int i;
register STR p;
UWORD c;
p = s;
i = 0;
/*window0();*/
while(1) {
p = line_skip_xcode(p);
if (c = etc_jfirst(p)) {
if (c & 0xff00) { /* 2バイト文字である */
w[i++] = c >> 8;
w[i++] = c & 0xff;
p += 2;
} else {
w[i++] = c;
p++;
}
/* if (i > MAX_TB) {
etc_beep();
under_print("再変換にする対象が長すぎます");
return(1);
}
*/
} else {
break;
}
}
w[i] = EOS;
strcpy(TBUFF,w);
TBUFFC = TBCP = i;
xf_disp_insert(&TX,&TY);
return(0);
}
/* 非零ならばフル */
int
xf_append_tb_check(UINT c)
{
if (c & 0xff00) { /* 2バイト文字である */
return((TBUFFC+2) > MAX_TB);
} else { /* 1バイト文字である */
return((TBUFFC+1) > MAX_TB);
}
}
/* TBCP < TBUFFC である */
/* TBCP を1つ進める */
int
xf_forward_tb()
{
UINT c;
if (etc_check_char_kind_1byte(c = TBUFF[TBCP++])-1) {
TBCP++;
} else { /* 1バイト文字である */
}
xf_disp_insert(&TX,&TY);
return(0);
}
/* TBCP を1文字分戻す */
/* 戻した文字コードを返す */
/* 戻さなかったら零 */
/* BACK */
UINT
xf_back_tb()
{
UINT c;
if (!TBCP) {
return(0);
}
c = etc_j_n_char(TBUFF,TBCP);
if (c & 0xff00) { /* 2バイト文字である */
TBCP -= 2;
} else { /* 1バイト文字である */
TBCP--;
}
/* TBUFF[TBCP] = EOS;*/
return(c);
}
#if 0
/* TBUFF_R の位置の1文字を削除する */
/* 必ず削除する */
/* BS */
void
xf_delete_tb_r()
{
STR p;
etc_jlast_p(TBUFF_R,&p);/* 文字列の最後の文字を返す *//* 全角文字にも対応 */
*p = EOS;
TBUFFC_R = p - TBUFF_R;
}
#endif
/* TBCP の位置の左の1文字を削除する */
/* 削除した文字コードを返す */
/* 削除しなかったら零 */
/* BS */
UINT
xf_delete_tb()
{
UINT c;
if (!TBCP) {
return(0);
}
c = etc_j_n_char(TBUFF,TBCP);
if (c & 0xff00) { /* 2バイト文字である */
/*etc_beep();etc_beep();etc_beep();*/
strncpy(&TBUFF[TBCP-2],&TBUFF[TBCP],TBUFFC-TBCP);
TBUFF[TBUFFC -= 2] = EOS;
TBCP -= 2;
} else { /* 1バイト文字である */
strncpy(&TBUFF[TBCP-1],&TBUFF[TBCP],TBUFFC-TBCP);
TBUFF[--TBUFFC] = EOS;
TBCP--;
}
return(c);
}
/* TL0,TPX0,TX0,TY0,TBP0 */
/* TL1,TPX1,TX1,TY1,TBP1 */
/* の2点に挟まれた間を表示する */
/* fn が現在作業中の文節 */
/* 中断なら非零 */
int
xf_disp_insert(int *rx,int *ry)
{
UBYTE first_left[TBUFF_SIZE];
UBYTE f0[TBUFF_SIZE];
register int i;
int upc; /* スクロールアップしたカウンタ */
int wTX0,wTY0;
UBYTE stock;
line_get_body(first_left,TL0);
first_left[TBP0] = EOS; /* 未変換の対象になってない左部分 */
wTX0 = TX0;
wTY0 = TY0;
etc_color(RAW);
stock = TBUFF[TBCP];
TBUFF[TBCP] = EOS; /* 臨時に切る */
/* LAST_T = TBCP;*/
upc = disp_out_stop(first_left,&wTX0,&wTY0,TBUFF);
if (upc) { /* 画面から出る */
if ((TY0 -= upc) < 0) {
TY0 += upc; /* 戻す */
*TBUFF = EOS;
xf_ob();
return(1);
}
}
if ((TBUFFC+2) > MAX_TB) {
xf_init_tb_r00();
} else {
etc_color(MIZU_EMPH_REV);
LAST_TR = TBUFFC_R;
upc = disp_out_stop(first_left,&wTX0,&wTY0,TBUFF_R);
if (upc) { /* 画面から出る */
if ((TY0 -= upc) < 0) {
TY0 += upc; /* 戻す */
*TBUFF_R = EOS;
xf_ob();
return(1);
}
}
}
*rx = wTX0;
*ry = wTY0;
etc_color(NORMAL);
TBUFF[TBCP] = stock; /* 戻す */
#if 0
upc = disp_out_stop(first_left,&wTX0,&wTY0,&TBUFF[TBCP]);
if (upc) { /* 画面から出る */
if ((TY0 -= upc) < 0) {
TY0 += upc; /* 戻す */
TBUFF[TBCP] = EOS;
xf_ob();
return(1);
}
}
#endif
disp_trans_half_flush(TL1,TBP1,wTX0,wTY0);
return(0);
}
/* 変換中にウインドウからはみでた */
void
xf_ob()
{
etc_color(NORMAL);
under_print0((STR)"ウィンドウが狭すぎます。変換するためにはもっと広くして下さい。([Y]で確認)?");
while(toupper(fep_inkey_raw()) != 'Y') {
}
xf_init_tb();
ctrl_ubar();
work_replace_str_echo(TL0,TBP0,TL1,TBP1,"",0,TY0);
under_print((STR)"変換中の文字列は破棄しました");
*TBUFF = EOS;TBUFFC = 0;
etc_func_on(); /* 数字選択状態から脱出 */
disp_top_flush(TTOPL00);
CL = TL00;
CPX = TPX00;
CX = TX00;
CY = TY00;
xf_ikinari_kakutei();
line_cl_cl();
work_line_analyze();
work_cursor_cpx();
}
void
xf_get_last(STR last,int fn,STR kc,STR k1)
{
register int i;
*last = EOS;
for(i=0;i<fn;i++) {
strcat(last,SEG[i]);
} /* 半確定の文節をひとつにまとめる */
strcat(last,kc);
strcat(last,k1);
strcat(last,&TBUFF[TBCP]);
}
/* コード入力 */
UINT
xf_code_input()
{
int i;
UINT c,c0,code;
LEDMOD(2,0);
ledpat = B_BPEEK(LEDSTAT); /* LEDSTAT */
fep_mode_set0(FP_MODE_MUHEN_0); /* 半角、ひらがな、ANK、無変換 */
#if 0
B_BPOKE(LEDSTAT,ledpat | 0b00000100); /* コード入力LED点灯 */
#endif
kigou_or_code = 0;
while(1) {
xf_code_input_sub();
i = code = 0;
while(i<4) { /* 4桁入力 */
window_abs_loc(20+i,UNDER_Y+1);
etc_color(MIZU_REV);
B_PUTC(' ');
etc_color(RAW0);
if (UNDER_FLAG) {
fep_input_flush(); /* カーソルをちゃんと戻す */
} else {
work_cursor_cpx();
}
c0 = c = toupper(fep_inkey_raw_not_code());
switch(c) {
case 'F':
case 'E':
case 'D':
case 'C':
case 'B':
case 'A':
if (code_input_mode) { /* 区点モードなのに A-F だった */
etc_beep();
break;
}
c -= 'A'-'0'-10;
case '9':
case '8':
case '7':
case '6':
case '5':
case '4':
case '3':
case '2':
case '1':
case '0':
c -= '0';
window_abs_loc(20+i,UNDER_Y+1);
B_PUTC(c0); /* エコー */
if (code_input_mode) {
code = code*10+c;
} else {
code = code*16+c;
}
while(fep_get_key());
i++;
break;
case 'H'-'@':
if (i) {
if (code_input_mode) {
code /= 10;
} else {
code /= 16;
}
window_abs_loc(20+i,UNDER_Y+1);
etc_color(RAW0);
B_PUTC(' ');
i--;
}
break;
case '['-'@':
case 0x10c: /* コード入力 */
FNCKEYST(7,f7_buff);
etc_func_on();
etc_while_fep_qxf(); /* 離されるまで待つ */
B_BPEEK(LEDSTAT,ledpat); /* 戻す */
LEDMOD(2,0);
/* kigou_or_code = 0; */
fep_mode_set(FP_MODE);
etc_color(NORMAL);
if (UNDER_FLAG) {
fep_input_flush(); /* カーソルをちゃんと戻す */
} else {
work_cursor_cpx();
}
return(0);
case 0x207: /* F7 : JIS/シフトJIS <-> 区点 */
code_input_mode = !code_input_mode;
i = code = 0;
while(fep_qxf2());
xf_code_input_sub();
fep_key_clear();
continue;
default: /* 変なコード */
break;
}
}
if (code_input_mode) { /* 区点コードである */
UINT w;
if ((101 <= code) && (code <= 9494)) {
w = (code/100) + 0x20;
code = (code % 100) + 0x20;
code |= (w << 8);
} else {
etc_beep();
xf_code_input_sub();
continue;
}
}
if (code < 0x8000) {
code = JISSFT(code);
}
if (etc_normal_jis(code) == code) {
kigou_or_code = 2;
etc_color(NORMAL);
fep_mode_set(FP_MODE);
if (UNDER_FLAG) {
fep_input_flush(); /* カーソルをちゃんと戻す */
} else {
work_cursor_cpx();
}
return(code);
} else if (etc_is_normal_han(code)) {
kigou_or_code = 2;
etc_color(NORMAL);
fep_mode_set(FP_MODE);
if (UNDER_FLAG) {
fep_input_flush(); /* カーソルをちゃんと戻す */
} else {
work_cursor_cpx();
}
return(code);
}
}
}
void
xf_code_input_sub()
{
window_abs_loc(0,UNDER_Y+1);
B_PRINT("\x1b[0K"); /* カーソルから右をクリア */
etc_color(RAW0);
if (code_input_mode) {
B_PRINT(" [区点] CODE : ");
} else {
B_PRINT(" [JIS,SHIFT] CODE : ");
}
}
void
xf_toggle_fp_mode(int i)
{
if (FP_MODE[i] == "ZKRM"[i]) {
FP_MODE[i] = (UBYTE)"H--H"[i];
} else {
FP_MODE[i] = (UBYTE)"ZKRM"[i];
}
disp_hmode();
}
#define kigou_max_block 50
UINT block_top[kigou_max_block][2] = {
0x8000,0x80FF,
0x8140,0x81FF,
0x8240,0x82FF,
0x8340,0x83FF,
0x8440,0x84FF,
0x889F,0x889F, /* (1文字のみ) */
0x88A0,0x88FF,
0x8940,0x89FF,
0x8A40,0x8AFF,
0x8B40,0x8BFF,
0x8C40,0x8CFF,
0x8D40,0x8DFF,
0x8E40,0x8EFF,
0x8F40,0x8FFF,
0x9040,0x90FF,
0x9140,0x91FF,
0x9240,0x92FF,
0x9340,0x93FF,
0x9440,0x94FF,
0x9540,0x95FF,
0x9640,0x96FF,
0x9740,0x97FF,
0x9840,0x98FF,
0x9940,0x99FF,
0x9A40,0x9AFF,
0x9B40,0x9BFF,
0x9C40,0x9CFF,
0x9D40,0x9DFF,
0x9E40,0x9EFF,
0x9F40,0x9FFF,
0xE040,0xE0FF,
0xE140,0xE1FF,
0xE240,0xE2FF,
0xE340,0xE3FF,
0xE440,0xE4FF,
0xE540,0xE5FF,
0xE640,0xE6FF,
0xE740,0xE7FF,
0xE840,0xE8FF,
0xE940,0xE9FF,
0xEA40,0xEAFF,
0xEB40,0xEBFF,
0xEC40,0xECFF,
0xED40,0xEDFF,
0xEE40,0xEEFF,
0xEF40,0xEFFF,
0xF020,0xF1FF,
0xF220,0xF3FF,
0xF420,0xF4FF,
0xF520,0xF5FF};
/* code が bn 番目のブロックに入っていたらOK(bn を返す) */
/* さもなくば正しいブロックを返す */
/* そして、begin_kigou を強制的に書き換える */
int
xf_kigou_check(UINT code, int bn)
{
int flag;
if ((block_top[bn][0] <= code) && (code <= block_top[bn][1])) {
return(bn);
} else {
if (code < block_top[bn][0]) { /* 下へずれた */
flag = 1;
if (bn) {
bn--;
} else {
bn = kigou_max_block-1;
}
} else { /* 上へずれた */
flag = 0;
if (bn != (kigou_max_block-1)) {
bn++;
} else {
bn = 0;
}
}
if (bn != 5) {
kigou_begin = (block_top[bn][flag] & 0xfff0) + (code & 0x000f);
} else {
kigou_begin = 0x889f;
}
return(bn);
}
}
/* code が何番目のブロックかを返す */
int
xf_kigou_block_number(UINT code)
{
register int i;
for(i=0;i<kigou_max_block;i++) {
if ((block_top[i][0] <= code) && (code <= block_top[i][1])) {
return(i);
}
}
error("おかしなコードです");
return(-1);
}
int kigou_new_flag;
/* 記号入力 */
UINT
xf_kigou()
{
UINT c;
int blockn;
if ((!kigou_new_flag) && (FP_MODE[3] == 'H')) { /* 変換モードであった */
xf_ikinari_kakutei();
strcpy(FP_MODE_HEN,FP_MODE);
strcpy(FP_MODE,FP_MODE_MUHEN);
kigou_new_flag = 1;
}
disp_hmode(); /* 一番下の行に変換モード表示を行う */
fep_follow_led();
kigou_or_code = 0;
blockn = xf_kigou_block_number(kigou_begin);
disp_kigou_koho(); /* 取敢えず16個表示 */
while(1) {
if (UNDER_FLAG) {
fep_input_flush(); /* カーソルをちゃんと戻す */
} else {
work_cursor_cpx();
}
etc_while_fep_qxf(); /* 離されるまで待つ */
/* fep_key_clear();*/
c = toupper(fep_inkey_raw());
fep_key_clear();
if (c == XF_RIGHT_KOHO_KEY) { /* 年上のコードへ */
blockn = xf_kigou_check(++kigou_begin,blockn);
disp_kigou_koho();
} else if (c == XF_LEFT_KOHO_KEY) { /* 若いコードへ */
blockn = xf_kigou_check(--kigou_begin,blockn);
disp_kigou_koho();
} else if (c == XF_BEFORE_BLOCK_KEY) { /* 若いブロックへ */
kigou_begin = (kigou_begin-0x10) & 0xfff0;
blockn = xf_kigou_check(kigou_begin,blockn);
disp_kigou_koho();
} else if (c == XF_NEXT_BLOCK_KEY) { /* 年上のブロックへ */
kigou_begin = (kigou_begin+0x10) & 0xfff0;
blockn = xf_kigou_check(kigou_begin,blockn);
disp_kigou_koho();
} else if (c == XF_NEXT_PAGE_KEY) { /* 次のブロックの先頭へ */
if (blockn == 5) {
blockn = 7;
} else {
blockn++;
}
if (blockn >= kigou_max_block) {
blockn = 0;
}
kigou_begin = block_top[blockn][0];
disp_kigou_koho();
} else if (c == XF_BEFORE_PAGE_KEY) {
/* 今のブロックの先頭へ、先頭だったら前のブロックの先頭へ */
if (kigou_begin == block_top[blockn][0]) { /* 先頭だった */
if (blockn == 7) {
blockn = 5;
} else {
blockn--;
}
if (blockn < 0) {
blockn = kigou_max_block-1;
}
} else { /* 先頭ではなかった */
if (blockn == 6) {
blockn = 5;
}
}
kigou_begin = block_top[blockn][0];
disp_kigou_koho();
} else if (c == ('M'-'@')) {
UINT cn;
cn = etc_normal_jis(kigou_begin);
kigou_or_code = 1;
return(cn);
} else if ((c == 0x108) || (c == '['-'@')) { /* 記号入力 */
etc_func_on();
etc_while_fep_qxf(); /* 離されるまで待つ */
kigou_or_code = 0;
if (kigou_new_flag) {
strcpy(FP_MODE_MUHEN,FP_MODE);/* ,,, */
strcpy(FP_MODE,FP_MODE_HEN);
}
disp_hmode(); /* 一番下の行に変換モード表示を行う */
fep_follow_led();
kigou_new_flag = 0;
if (UNDER_FLAG) {
fep_input_flush(); /* カーソルをちゃんと戻す */
} else {
work_cursor_cpx();
}
return(0);
}
}
}
#define MAIN_DIC 0
#define SUB_DIC 1
/* 辞書登録 */
void
xf_touroku()
{
int f,c;
STR p;
int main_or_sub,hinshi;
UBYTE yomi[MAXLINE],mojiretu[MAXLINE];
UBYTE w[MAXLINE];
UNIT *wp;
xf_ikinari_kakutei();
etc_while_fep_qxf();
c = work_make_cut_buff0_list((STR)NULL,(STR)"",(STR)"");
/* -1 = 空、さもなくば、CUT_BUFF の総バイト長を返す */
if (c <= 0) {
under_print((STR)"カットバッファの中に登録する文字列を入れておいて下さい[中断]");
return;
}
if (c > 32) {
under_print((STR)"登録しようとする文字列が長すぎます[中断]");
return;
}
wp = work_get_from_cut_buff0_list(); /* 一行持って来る */
line_get_body(mojiretu,wp);
if (!etc_remove_cr_tab(mojiretu)) {
under_print((STR)"登録できません[中断]");
return;
}
sprintf((char *) w,"[%s] を辞書に登録します。読みを入力して下さい:",mojiretu);
c = FP_MODE[3];
fep_hmode_set('M'); /* 一時的に無変換にする */
if (under_input_cr(w,yomi) < 0) { /* 無効であった = ^G */
under_print((STR)"[中断]");
fep_hmode_set(c); /* 戻す */
return;
}
fep_hmode_set(c); /* 戻す */
hinshi = xf_get_hinshi();
if ((hinshi < 1) || (hinshi > 30)) { /* 品詞コードではない */
under_print((STR)"[中断]");
return;
}
f = under_input_cr_raw((STR)"メイン辞書(=0)ですか、それともサブ辞書(=1)ですか?(中止=ESC):",w);
main_or_sub = atoi((char *) w);
if (((*w != '0') && (*w != '1')) || (f < 0) || (main_or_sub < 0) || (main_or_sub > 1)) {
under_print((STR)"[中断]");
return;
}
{
int mode;
mode = KNJCTRL(8);
KNJCTRL(7,0); /* lock */
f = KNJCTRL(30,main_or_sub,yomi,mojiretu,hinshi);
KNJCTRL(7,mode);
}
if (f) {
switch(f) {
case 1:
p = (STR)"辞書の種類が不適当です";
break;
case 2:
p = (STR)"文法コード(品詞)が不適当です";
break;
case 3:
p = (STR)"読みが不適当です";
break;
case 4:
p = (STR)"登録するページがありません";
break;
}
etc_beep();
} else {
if (main_or_sub) {
p = (STR)"サブ辞書に登録しました";
} else {
p = (STR)"メイン辞書に登録しました";
}
}
under_print(p);
etc_while_fep_qxf(); /* 離されるまで待つ */
}
/* 辞書削除 */
void
xf_sakujyo()
{
int f,c;
STR p;
int main_or_sub,hinshi;
UBYTE yomi[MAXLINE],mojiretu[MAXLINE];
UBYTE w[MAXLINE];
UNIT *wp;
xf_ikinari_kakutei();
etc_while_fep_qxf();
c = work_make_cut_buff0_list((STR)NULL,(STR)"",(STR)"");
/* -1 = 空、さもなくば、CUT_BUFF の総バイト長を返す */
if (c <= 0) {
under_print((STR)"カットバッファの中に辞書から削除する文字列を入れておいて下さい[中断]");
return;
}
if (c > 32) {
under_print((STR)"削除しようとする文字列が長すぎます[中断]");
return;
}
wp = work_get_from_cut_buff0_list(); /* 一行持って来る */
line_get_body(mojiretu,wp);
if (!etc_remove_cr_tab(mojiretu)) {
under_print((STR)"登録できません[中断]");
return;
}
c = FP_MODE[3];
fep_hmode_set('M'); /* 一時的に無変換にする */
sprintf((char *) w,"[%s] を辞書から削除します。読みを入力して下さい:",mojiretu);
if (under_input_cr(w,yomi) < 0) { /* 無効であった = ^G */
under_print((STR)"[中断]");
fep_hmode_set(c); /* 戻す */
return;
}
fep_hmode_set(c); /* 戻す */
hinshi = xf_get_hinshi();
if ((hinshi < 1) || (hinshi > 30)) { /* 品詞コードではない */
under_print((STR)"[中断]");
return;
}
f = under_input_cr_raw((STR)"メイン辞書(=0)ですか、それともサブ辞書(=1)ですか?(中止=ESC):",w);
main_or_sub = atoi((char *) w);
if (((*w != '0') && (*w != '1')) || (f < 0) || (main_or_sub < 0) || (main_or_sub > 1)) {
under_print((STR)"[中断]");
return;
}
{
int mode;
mode = KNJCTRL(8);
KNJCTRL(7,0); /* lock */
f = KNJCTRL(31,main_or_sub,yomi,mojiretu,hinshi);
KNJCTRL(7,mode);
}
if (f) {
switch(f) {
case -1:
p = (STR)"削除する単語が見つかりません";
break;
case 1:
p = (STR)"辞書の種類が不適当です";
break;
case 2:
p = (STR)"文法コード(品詞)が不適当です";
break;
case 3:
p = (STR)"読みが不適当です";
break;
case 4:
p = (STR)"辞書が見つかりません";
break;
}
etc_beep();
} else {
p = (STR)"単語を削除しました";
}
under_print(p);
etc_while_fep_qxf(); /* 離されるまで待つ */
}
#if 0
void
xf_dic_report()
{
UBYTE w[MAXLINE],maindic[MAXLINE],subdic[MAXLINE];
KNJCTRL(41,maindic,subdic);
strcpy(w,"メイン:");
strcat(w,maindic);
strcat(w,", サブ:");
strcat(w,subdic);
under_print(w);
}
#endif
void
xf_dic_learn_mode()
{
int mode;
if (mode = KNJCTRL(12)) { /* 学習モードを得る */
under_print((STR)"[ディスク学習をメモリ学習に変更しました]");
} else {
under_print((STR)"[メモリ学習をディスク学習に変更しました]");
}
KNJCTRL(11,!mode);
}
STR hinshi_mess[31][2] = {
(STR)"カーソルキーで上下して、品詞を選んで下さい。<NL> で確定です", (STR)"(中断)",
(STR)"動詞カ行五段活用", (STR)"聞-く",
(STR)"動詞ガ行五段活用", (STR)"泳-ぐ",
(STR)"動詞サ行五段活用", (STR)"話-す",
(STR)"動詞タ行五段活用", (STR)"勝-つ",
(STR)"動詞ナ行五段活用", (STR)"死-ぬ",
(STR)"動詞バ行五段活用", (STR)"飛-ぶ",
(STR)"動詞マ行五段活用", (STR)"読-む",
(STR)"動詞ラ行五段活用", (STR)"切-る",
(STR)"動詞ワ行五段活用", (STR)"使-う",
(STR)"動詞サ行変格活用", (STR)"する",
(STR)"動詞カ行変格活用", (STR)"来る",
(STR)"動詞一段活用", (STR)"見-る 教え-る(上一段活用、下一段活用)",
(STR)"形容詞", (STR)"新し-い 良-い(ク活用とシク活用は区別しない)",
(STR)"形容動詞", (STR)"静か-だ",
(STR)"形容動詞複合名詞", (STR)"純粋(な人)のように形容動詞としても使う名詞",
(STR)"サ変複合名詞", (STR)"愛(する)、惨敗(する)のようにサ変複合動詞になる名詞",
(STR)"名詞", (STR)"形容動詞の語幹やサ変複合動詞にならない名詞",
(STR)"単漢字", (STR)"漢字の読みの登録",
(STR)"人名(姓)", (STR)"人名の姓",
(STR)"人名(名)", (STR)"人名の名",
(STR)"地名", (STR)"地名",
(STR)"団体名", (STR)"会社名、法人名、政党名など",
(STR)"物の名称", (STR)"商品名など",
(STR)"数詞", (STR)"個、匹など",
(STR)"数字", (STR)"数字",
(STR)"接尾語", (STR)"語の下につける語(さ、さん、めく、ぽい、がる など)",
(STR)"感動詞", (STR)"感動や呼びかけ、話の受け答え(おや、まあ、はい など)",
(STR)"接続詞", (STR)"前の言葉と後の言葉をつなぐ語(または、そこで など)",
(STR)"副詞", (STR)"活用語を修飾する語(はっきり、たいへん、実に など)",
(STR)"連体詞", (STR)"非活用語を修飾する語(たった、あらゆる、あの など)"
};
int
xf_get_hinshi()
{
UBYTE w[MAXLINE];
int h;
UINT c;
h = touroku_hinshi;
while(1) {
sprintf((char *)w,"%-16s ↑[%2d] ↓例:%s",hinshi_mess[h][0],h,hinshi_mess[h][1]);
under_print(w);
if (h) {
window_abs_loc(21,UNDER_Y);
} else {
window_abs_loc(67,UNDER_Y);
}
c = fep_inkey_raw();
if ((c == 'M'-'@') || (c == 'J'-'@')) {
touroku_hinshi = h;
return(h);
}
if (c == '['-'@') {
return(0);
}
if (c == XF_BEFORE_BLOCK_KEY) { /* 下向き矢印 */
if (--h < 0) {
h = 30;
}
} else if (c == XF_NEXT_BLOCK_KEY) { /* 上向き矢印 */
if (++h > 30) {
h = 0;
}
}
}
}
/* 辞書の学習をフラッシュする */
void
xf_dic_flush()
{
KNJCTRL(29);
}
int
xf_append_tb_r(UINT c)
{
if (c < 0x100) {
TBUFF_R[TBUFFC_R++] = c;
} else {
TBUFF_R[TBUFFC_R++] = (c >> 8) & 0xff;
TBUFF_R[TBUFFC_R++] = c & 0xff;
}
TBUFF_R[TBUFFC_R] = EOS;
/*printf("[%x:%x:%x]",TBUFF_R[0],TBUFF_R[1],TBUFF_R[2]);getchar();*/
xf_disp_insert(&TX,&TY);
work_cursor_cpx();
return(0);
}
void
xf_init_tb_r0()
{
UWORD l;
if (DUM_FLAG) {
return;
}
l = etc_jlast(TBUFF);
/* if (l == L'っ') {
return;
}
*/
/* if ((l == L'ん') && !(strstr("KSTNHMYRWGZJDBVP",TBUFF_R))) {*/
/* if ((l == L'ん') && !(strstr("KCSTNHMFYRLWGZJDBVP",TBUFF_R))) {*/
if ((l == L'ん') && (strstr("AEIOU",TBUFF_R))) {
TBUFFC_R = 0;
*TBUFF_R = EOS;
B_BPOKE(fep_p1,0);
B_BPOKE(fep_p2,0);
fep_p2_last = B_BPEEK(fep_p2);
}
}
void
xf_init_tb_r00()
{
B_BPOKE(fep_p1,0);
B_BPOKE(fep_p2,0);
}
/* r == "N" なら 'ん' にする */
/* r を d に cat する */
/* xf_init_tb_r() を呼ぶ */
void
xf_cat_r_init(UBYTE *d,UBYTE *r)
{
if (!jstrcmp(r,"N") || !jstrcmp(r,"n")) {
strcpy(r,"ん");
} else if (!strcmp(r,"N") || !strcmp(r,"n")) {
strcpy(r,"ン");
}
strcat(d,r);
xf_init_tb_r();
}
void
xf_init_tb_r()
{
/*
window0();
printf("(%d)(%s)",TBUFFC_R,TBUFF_R);
binkey();
*/
if (!DUM_FLAG) {
B_BPOKE(fep_p1,0);
B_BPOKE(fep_p2,0);
fep_p2_last = B_BPEEK(fep_p2);
}
if (TBUFFC_R) {
TBUFFC_R = 0;
*TBUFF_R = EOS;
/* xf_disp_insert(&TX,&TY);*/
xf_check(0x1ff);
}
}
void
xf_tb_r_follow()
{
register int i,c1,c2;
register UINT c;
if (DUM_FLAG) {
return;
}
if (((VERSION < 300) && ((c1 = B_BPEEK(fep_p1)) == (c2 = B_BPEEK(fep_p2)))) ||
((VERSION >= 300) && !(c1 = B_BPEEK(fep_p1)))) {
xf_init_tb_r();
/* xf_disp_insert(&TX,&TY);*/
} else {
if ((!TBUFFC_R) && (!TBUFFC)) { /* 未確定入力開始 */
TTOPL00 = line_my_top();
TL00 = TL1 = TL0 = CL; /* 変換バッファの開始行 */
CRX = CRY = 0;
TPX00 = TPX0 = CPX;
TX00 = TX = TX0 = CX;
TY00 = TY = TY0 = CY;
TBP1 = TBP00 = TBP0 = ANALYZE[CPX].BPOS;
}
TBUFFC_R = 0;
if (VERSION < 300) {
i = c1;
} else {
i = 1;
TBUFFC_R = 0;
*TBUFF_R = EOS;
}
while(1) {
if (VERSION < 300) {
c = B_BPEEK(fep_pr+i);
} else {
c = B_BPEEK(fep_pr+i*2);
}
if (!isalpha(c)) {
break;
}
#if 1
if ((!TBUFFC_R) && (VERSION >= 300) && (fep_shift_ctrl() == 0x10)
&& ((FP_MODE[1] == 'K') || (FP_MODE[2] == 'R'))
&& (FP_MODE[0] == 'Z') && (toupper(c) == 'Z')) {
B_BPOKE(fep_p1,B_BPEEK(fep_p1)-1);
B_BPOKE(fep_p1+i*2,0);
strcat(TBUFF,TBUFF_R);
*TBUFF_R = EOS;
TBUFFC_R = 0;
/* xf_disp_insert(&TX,&TY);*/
fep_push_key(L'っ');
break;
/*
TBUFF_R[TBUFFC_R++] = (c >> 8) & 0xff;
TBUFF_R[TBUFFC_R++] = c & 0xff;
xf_cat_r_init(TBUFF,TBUFF_R);
*/
} else {
if (FP_MODE[0] == 'Z') { /* 全角モード */
c = hantozen(c);
}
}
#endif
#if 0
if (FP_MODE[0] == 'Z') { /* 全角モード */
c = hantozen(c);
}
#endif
if (c & 0xff00) {
TBUFF_R[TBUFFC_R++] = (c >> 8) & 0xff;
TBUFF_R[TBUFFC_R++] = c & 0xff;
} else {
TBUFF_R[TBUFFC_R++] = c;
}
if ((VERSION >= 300) && (i >= B_BPEEK(fep_p1))) {
break;
}
i++;
if ( i > 9) i = 0;
if ((VERSION < 300) && (i == c2)) {
break;
}
}
TBUFF_R[TBUFFC_R] = EOS;
}
}
void
xf_flush_tb_r()
{
if ((TBCP+TBUFFC_R) < 80) {
TBCP += TBUFFC_R;
TBUFFC += TBUFFC_R;
xf_cat_r_init(TBUFF,TBUFF_R);
}
xf_init_tb_r();
}
void
xf_flush_tb_r_under()
{
/* strcat(right,TBUFF_R);*/
rightc += TBUFFC_R;
xf_cat_r_init(right,TBUFF_R);
/* xf_init_tb_r();*/
}
void
xf_disp_tb_r_under()
{
etc_color(MIZU_EMPH_REV);
B_PRINT(TBUFF_R);
etc_color(NORMAL);
}
void
xf_rubi(STR s)
{
UINT c,c0;
register STR d;
UBYTE w[VERY_LONG_LINE];
/* work_replace_str_echo(TL0,TBP0,TL1,TBP1,"",0,TY0);*/
d = w;
while(s = etc_jfirst_x(s,&c)) {
if (c < 0x100) {
if (c == ' ') { /* 半角スペースは CENTER がらみで特別に許可 */
*d++ = (UBYTE)c;
}
continue;
}
c0 = zentohan(c);
if (c0 == c) { /* 変換されなかった */
continue;
} else { /* 変換された */
UBYTE up_code;
if (jishira(c)) { /* 全角ひらがなである */
up_code = 0xf1;
} else {
up_code = 0xf0;
}
*d++ = (UBYTE) up_code;
*d++ = (UBYTE) c0; /* 下位バイト */
if (c0 & 0xff00) { /* 2バイトだ(濁点、半濁点がある) */
*d++ = (UBYTE) up_code;
*d++ = (UBYTE)(c0 >> 8); /* ?点 */
}
}
}
*d = EOS;
/* w[] にルビが入っている */
if (*w) {
line_seigyou();
change_check();
if (!LYW_UPPER && (!CWY0 && (CWY1 == UNDER_Y-2))) {
ctrl_t_u();
}
etc_trim_tail();
if (!line_length(CL) && (CL->ATO == TAIL)) {
return;
}
xf_set_rubi(CL,ANALYZE[CPX].BPOS,w);
}
}
/* p1 ユニットの b1 から rdata をルビとして埋め込んでいく */
void
xf_set_rubi(UNIT *p1,int b1,STR rdata)
{
while((rdata = xf_set_rubi1(p1,b1,rdata)) && (p1 != TAIL)) { /* まだ rdata が残っている */
p1 = p1->ATO;
b1 = 0;
}
line_cl_cl();
work_line_analyze();
work_cursor_cpx();
}
/* p1 の b1 から rdata をルビとして挿入する */
/* rdata が残ったら、残ったアドレスを返す */
/* 残らなかったら NULL を返す */
STR
xf_set_rubi1(UNIT *p1,int b1,STR rdata)
{
UBYTE l[VERY_LONG_LINE],s[VERY_LONG_LINE];
register int count,bc,bc0,b2;
int dummy;
register UBYTE *p;
UINT code1,code2,code3;
line_get_body(l,p1);
count = bc = b1;
b2 = strlen(l);
strncpy(s,l,count);
while((bc < b2) && rdata && (*rdata)) {
/* p[bc] から始めて、次の文字までのバイト数を返す */
/* *xc から表示しているとして、*xc を更新する */
bc0 = bc;
p = line_skip_xcode(&l[bc]);
bc = p - l;
p = string_search_xcode(&l[bc0]);
/* 最初の XCODE の位置:実体を通り過ぎるかもしれない */
while(1) {
code3 = code1 = etc_jfirst(&l[bc]);
if (!code1 || (code1 == CR)) {
/* 実体をチェック、改行や EOS にルビは付かない */
break;
}
if ((!p) || ((UINT)p >= (UINT)&l[bc])) {
/* この行にはもう XCODE が無い or もっと先 */
/* 素直に納める */
s[count++] = XCODE_UP;
if (etc_char_disp_len(code1) == 1) { /* 表示幅チェック */
/* 半角文字である */
s[count++] = XCODE_RB1;
rdata = etc_jfirst_x(rdata,&code1);
if (code1 && (code1 != 0xf020)) {
s[count++] = (code1 >> 8);
s[count++] = code1 & 0xff;
} else {
count -= 2;
}
} else {
rdata = etc_jfirst_x(rdata,&code1);
if (code1 == ' ') { /* 半角スペースなので CENTER */
rdata = etc_jfirst_x(rdata,&code2);
if (code2) {
s[count++] = XCODE_RB10;
s[count++] = (code2 >> 8);
s[count++] = code2 & 0xff;
}
} else {
rdata = etc_jfirst_x(rdata,&code2);
if (code1 == 0xf020) { /* 右肩か無しか */
if ((code2) && (code2 != 0xf020)) { /* 右肩 */
s[count++] = XCODE_RB1R;
s[count++] = (code2 >> 8);
s[count++] = code2 & 0xff;
} else { /* 無し */
count--;
}
} else if ((!code2) || (code2 == 0xf020)) {
/* 左肩 */
s[count++] = XCODE_RB1L;
s[count++] = (code1 >> 8);
s[count++] = code1 & 0xff;
} else { /* 両肩 */
s[count++] = XCODE_RB2;
s[count++] = (code1 >> 8);
s[count++] = code1 & 0xff;
s[count++] = (code2 >> 8);
s[count++] = code2 & 0xff;
}
}
}
break;
} else {
code2 = *(++p);
if (code2 == XCODE_RB10) { /* 予約:1文字真ん中ルビ */
p += 2;
break;
} else if (code2 == XCODE_RB1) { /* 1文字ルビ(半角用) */
p += 2;
break;
} else if (code2 == XCODE_RB1L) { /* 1文字ルビ左(全角用) */
p += 2;
break;
} else if (code2 == XCODE_RB1R) { /* 1文字ルビ右(全角用) */
p += 2;
break;
} else if (code2 == XCODE_RB2) { /* 2文字ルビ(全角用) */
p += 4;
break;
}
/* ルビではなかった */
p = string_search_xcode(p); /* 次の XCODE の位置 */
}
}
strncpy(&s[count],&l[bc0],bc-bc0); /* XCODE を追加しておく */
count += bc-bc0;
if (code3 & 0xff00) {
s[count++] = code3 >> 8;
s[count++] = code3 & 0xff;
bc += 2;
} else {
s[count++] = code3;
bc++;
}
}
if (l[bc]) {
int ll;
ll = strlen(&l[bc]);
strncpy(&s[count],&l[bc],ll); /* 後ろに接続する */
s[count+ll] = EOS;
} else {
s[count] = EOS;
}
if (strlen(s)) {
line_store_and_echo(p1,s); /* 格納する */
}
return(rdata);
}
void
xf_do_121()
{
if (FP_MODE[3] == 'H') { /* 変換モードであった */
xf_ikinari_kakutei();
}
if (CXF1_FLAG) {
strcpy(FP_MODE_HEN,FP_MODE);
strcpy(FP_MODE,FP_MODE_MUHEN);
} else {
strcpy(FP_MODE_MUHEN,FP_MODE);
strcpy(FP_MODE,FP_MODE_HEN);
}
CXF1_FLAG = !CXF1_FLAG;
disp_hmode(); /* 一番下の行に変換モード表示を行う */
fep_follow_led();
etc_while_fep_qxf(); /* 離されるまで待つ */
}
UBYTE FP_MODE_MUHEN0[16];
UBYTE FP_MODE_HEN0[16];
UWORD CXF1_FLAG0;
void
xf_push_cxf1()
{
strcpy(FP_MODE_MUHEN0,FP_MODE_MUHEN);
strcpy(FP_MODE_HEN0,FP_MODE_HEN);
CXF1_FLAG0 = CXF1_FLAG;
}
void
xf_pop_cxf1()
{
strcpy(FP_MODE_MUHEN,FP_MODE_MUHEN0);
strcpy(FP_MODE_HEN,FP_MODE_HEN0);
CXF1_FLAG = CXF1_FLAG0;
}